/*
 ============================================================================
 Page	     : 259
 Name        : factor.c
 Date	     : 20210404
 Author      : Hbue 18060333
 Copyright   : Your copyright notice
 Description : 使用循环和递归计算阶乘
 ============================================================================
 */

#include <stdio.h>
long fact(int n);
long rfact(int n);

int main(void)
{
	int num = 0;

	printf("This program calculates factorials.\n");
	printf("Enter a value in the range 0-12 (q to quit):\n");
	while(scanf("%d", &num) == 1)
	{
		if(num < 0)
		{
			printf("No negative numbers, please.\n");
		}
		else if(num > 12)
		{
			printf("Keep input under 13.\n");
		}
		else
		{
			printf("loop: %d factorial = %ld\n", num, fact(num));
			printf("recursion: %d factorial = %ld\n", num, rfact(num));
		}
		printf("Enter a value in the range 0-12 (q to quit):\n");
	}
	printf("Bye.\n");

	return 0;
}

long fact(int n)		// 使用循环的函数
{
	long ans = 1;

	for(int i = 1; i <= n; i++)
	{
		ans *= i;
	}

	return ans;
}

long rfact(int n)		// 使用递归的函数
{
	if(n > 1)
	{
		return n * rfact(n - 1);
	}
	else
	{
		return 1;
	}
}

